package com.interview.jvm;

public class Example {  
	  
    String str = new String("good");  
  
    char[] ch = { 'a', 'b', 'c' };  
  
    public static void main(String args[]) {  
  
        Example ex = new Example();  
  
        ex.change(ex.str, ex.ch);  
  
        System.out.print(ex.str + " and ");  
  
        System.out.print(ex.ch);  
  
    }  
  
    public void change(String str, char ch[]) {  
  
        str = "test ok";  
  
        ch[0] = 'g';  
  
    }  
}  


//A、 good and abc  
//B、 good and gbc  
//C、 test ok and abc  
//D、 test ok and gbc   
//答案：B  


//解析：大家可能以为Java中String和数组都是对象所以肯定是对象引用，然后就会选D，其实这是个很大的误区：因为在java里没有引用传递，只有值传递  
//
//这个值指的是实参的地址的拷贝，得到这个拷贝地址后，你可以通过它修改这个地址的内容（引用不变），因为此时这个内容的地址和原地址是同一地址，  
//  
//但是你不能改变这个地址本身使其重新引用其它的对象，也就是值传递，可能说的不是很清楚，下面给出一个完整的能说明情况的例子吧：  
//  
// View Code  
//程序有些啰嗦，但能反映问题，该程序运行结果为：  
//  
//复制代码  
//对象交换前：p1 = Alexia female  
//对象交换前：p2 = Edward male  
//  
//对象交换后：p1 = Alexia female  
//对象交换后：p2 = Edward male  
//  
//对象数组交换前：arraya[0] = Alexia female, arraya[1] = Edward male  
//对象数组交换前：arrayb[0] = jmwang female, arrayb[1] = hwu male  
//  
//对象数组交换后：arraya[0] = Alexia female, arraya[1] = Edward male  
//对象数组交换后：arrayb[0] = jmwang female, arrayb[1] = hwu male  
//  
//基本类型数组交换前：a[0] = 0, a[1] = 1  
//基本类型数组交换前：b[0] = 1, b[1] = 2  
//  
//基本类型数组交换后：a[0] = 0, a[1] = 1  
//基本类型数组交换后：b[0] = 1, b[1] = 2  
//  
//对象数组内容交换并改变后：arraya[1] = wjl male  
//对象数组内容交换并改变后：arrayb[1] = Edward male  
//  
//基本类型数组内容交换并改变后：a[1] = 5  
//基本类型数组内容交换并改变后：b[1] = 1  
//复制代码  
//说明：不管是对象、基本类型还是对象数组、基本类型数组，在函数中都不能改变其实际地址但能改变其中的内容。